package com.lkc.service.impl;

import com.lkc.annotation.LogMethod;
import com.lkc.bean.Users;
import com.lkc.mapper.UsersDao;
import com.lkc.service.LoginService;
import com.lkc.util.PasswordUtil;
import com.lkc.util.SYS;
import com.lkc.util.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    UsersDao usersDao;

    /**
     * 用户登录
     * @param user 用户对象，包含用户名和密码
     * @return 登录成功后生成的 token
     */
    @LogMethod(serviceName = "登录服务", recordParam = true, recordReturn = true)
    @Override
    public String login(Users user) {
        // 1. 查询数据库中用户名对应的用户信息
        Users result = usersDao.getByusername(user.getUsername());
        if (result == null) {
            throw new RuntimeException("用户名或密码错误");
        }

        // 2. 验证密码
        String inputPassword = user.getPassword();     // 用户输入的明文密码
        String storedPassword = result.getPassword();  // 数据库存储的加密密码
        if (!PasswordUtil.checkPassword(inputPassword, storedPassword)) {
            throw new RuntimeException("用户名或密码错误");
        }

        // 3. 生成 token 并返回
        String token = TokenUtil.getToken(result.getUserId(), "username");

        // 返回 token，但日志切面中会记录 token 的前几位，避免泄露
        return token;
    }

    /**
     * 根据 token 获取当前登录用户信息
     * @param token 登录时生成的 token
     * @return 当前登录用户对象
     */
    @LogMethod(serviceName = "登录服务", recordParam = true, recordReturn = true)
    @Override
    public Users logininfo(String token) {
        // 从 token 中解析出用户 ID
        Object id = TokenUtil.getOption(token, SYS.TOKEN_KEY_ID);
        Users user = usersDao.one(Integer.parseInt(id.toString()));
        return user;
    }
}
